package com.cn.transfer.myanno;


import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

import java.lang.reflect.Field;

/**
 * 从applicationContext获取所有对象，
 *  在处理所有对象下的属性，
 *    属性上有MyAutowired标签的进行赋值处理
 *  但是 如果是代理对象，此处无效
 */

//@Component
public class MyAutowiredRegistry implements ApplicationContextAware {

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
        // 循环访问所有的bean对象
        for (int j =0; j < beanDefinitionNames.length; j++){
            // 每个bean对象
            Object bean = applicationContext.getBean(beanDefinitionNames[j]);
            // 获取对象的属性值
            Field[] fields = bean.getClass().getDeclaredFields();

            for (int i = 0; i < fields.length; i++) {
                // 如果属性值上包含MyAutowired标签
                if(fields[i].isAnnotationPresent(MyAutowired.class)){
                    MyAutowired myAutowired = fields[i].getAnnotation(MyAutowired.class);
                    // 拿到标签上的value值
                    String beanName = myAutowired.value();
                    if(beanName.isEmpty()){
                        beanName = fields[i].getType().getName();
                    }
                    // 开启暴力访问
                    fields[i].setAccessible(true);
                    try {
                        // 通过反射赋值
                        fields[i].set(bean, applicationContext.getBean(beanName));
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                }
            }
        }

    }
}
